# coding:utf8
# 何宇翔-P42023
# 第六周


# 高阶函数和柯里化
'''
    高阶函数：接受一个或多个函数作为参数，输出一个函数
    柯里化：将F=f(x,y)转化为F=f(x)(y)


'''
# 高阶函数
def foo(farg):
    def inc(iarg):
        return iarg-farg
    return inc

print(foo(4)(2))
# 柯里化
def add(x,y):
    return x+y

def add1(x):
    def _add(y):
        return x+y
    return _add

print(add1(20)(10))


'''
functools 下的函数
    wraps：伪装签名（装饰器版）
    update_wrapper:伪装签名
    lru_cache:缓存
    partial:偏函数-约束住某个参数，返回新函数

'''

# from functools import lru_cache

# 自定义缓存装饰器
import time
from functools import update_wrapper,wraps


# 假设传入值都是可哈希的，不可哈希的不许传入……
def mylru_cache(maxsize=128, typed=False):
    def _cache(fn):
        cache={}

        @wraps(fn)
        def wrapper(*args,**kwargs):

            if not cache.get(args):
                print('执行啦！！！')
                cache[args]=fn(*args,**kwargs)
            else:
                print('没执行！！！')

            return cache[args]

        return wrapper
    return _cache


@mylru_cache(maxsize=128,typed=False)
def add(x,y):
    time.sleep(4)
    return x+y


print(add(1,2))
print(add(1,2))
print(add(1,2))
print(add(1,3))
print(add(1,2))
print(add(1,2))





'''
    类型注解：为了对函数输入参数进行约束，避免难以预料地后果，
        人为地为函数参数设置类型，改变了函数签名
        但无强制约束力
        可利用装饰器进行检查
'''